home *** CD-ROM | disk | FTP | other *** search
-
- Free Information Xchange '98 presents:
-
- Powerboat Racing - CD crack by Static Vengeance
-
- Requirements:
- Full game install and hex editor
- W32Dasm if you want to follow along
-
- When I started this crack, the first thing I did was to install the program and run it without
- the CD in the drive to see how the program reacted. When I started up Powerboat Racing (PBR) it would
- come up but only have a few things to do from the main menu. One of the choises lacking on the main
- menu was starting a new game. Well, no pop up dialog box this time so things were going to be a little
- bit more involved then just double clicking on a "Insert CD..." string. The first plan of attack is to
- do a text string search for "GetDriveTypeA" which is a KERNEL32 call to get the type of drive to work
- with. The first occurrance didn't seem to have anything to do with the CD check, so I searched for the
- next occurrance and found this routine:
-
- * Referenced by a CALL at Addresses:
- |:0040AD1E , :0042B524 , :004531C8 , :0046D35A <-- Called from 4 different places
- |
- :0040C454 53 push ebx
- :0040C455 51 push ecx
- :0040C456 52 push edx
- :0040C457 56 push esi
- :0040C458 57 push edi
- :0040C459 55 push ebp
- :0040C45A 81EC18010000 sub esp, 00000118
- :0040C460 8D842414010000 lea eax, dword ptr [esp+00000114]
- :0040C467 50 push eax
- :0040C468 683F000F00 push 000F003F
- :0040C46D 6A00 push 00000000
-
- * Possible StringData Ref from Data Obj ->"Software\Promethean Designs\Powerboat "
- ->"Racing"
- |
- :0040C46F 6834CB4900 push 0049CB34
- :0040C474 6802000080 push 80000002
-
- * Reference To: ADVAPI32.RegOpenKeyExA, Ord:0005h <-- Getting info from the registry
- |
- :0040C479 2EFF1568014F00 Call dword ptr cs:[004F0168]
- :0040C480 85C0 test eax, eax
- :0040C482 0F8526010000 jne 0040C5AE
- :0040C488 8D84240C010000 lea eax, dword ptr [esp+0000010C]
- :0040C48F 50 push eax
- :0040C490 8D842418010000 lea eax, dword ptr [esp+00000118]
- :0040C497 50 push eax
- :0040C498 6A00 push 00000000
- :0040C49A 683F000F00 push 000F003F
- :0040C49F 6A00 push 00000000
- :0040C4A1 68C4BD4900 push 0049BDC4
- :0040C4A6 6A00 push 00000000
-
- * Possible StringData Ref from Data Obj ->"Software\Promethean Designs\Powerboat "
- ->"Racing"
- |
- :0040C4A8 6864CB4900 push 0049CB64
- :0040C4AD 6802000080 push 80000002
-
- * Reference To: ADVAPI32.RegCreateKeyExA, Ord:0003h
- |
- :0040C4B2 2EFF1560014F00 Call dword ptr cs:[004F0160]
- :0040C4B9 85C0 test eax, eax
- :0040C4BB 0F85ED000000 jne 0040C5AE
- :0040C4C1 8D842410010000 lea eax, dword ptr [esp+00000110]
- :0040C4C8 50 push eax
- :0040C4C9 8D442404 lea eax, dword ptr [esp+04]
- :0040C4CD 50 push eax
- :0040C4CE 8D842410010000 lea eax, dword ptr [esp+00000110]
- :0040C4D5 50 push eax
- :0040C4D6 6A00 push 00000000
-
- * Possible StringData Ref from Data Obj ->"Installed From" <-- the registry key for the CD drive letter
- |
- :0040C4D8 68D8CA4900 push 0049CAD8
- :0040C4DD 8B9C2428010000 mov ebx, dword ptr [esp+00000128]
- :0040C4E4 BA80000000 mov edx, 00000080
- :0040C4E9 53 push ebx
- :0040C4EA 89942428010000 mov dword ptr [esp+00000128], edx
-
- * Reference To: ADVAPI32.RegQueryValueExA, Ord:0006h
- |
- :0040C4F1 2EFF156C014F00 Call dword ptr cs:[004F016C]
- :0040C4F8 85C0 test eax, eax
- :0040C4FA 740A je 0040C506
-
- * Possible StringData Ref from Data Obj ->"Error reading Installed From registry "
- ->"value."
- |
- :0040C4FC B894CB4900 mov eax, 0049CB94
- :0040C501 E84AAB0200 call 00437050
-
- * Referenced by a (U)nconditional or (C)onditional Jump at Address:
- |:0040C4FA(C)
- |
-
- * Possible StringData Ref from Data Obj ->"PBOAT.EXE" <-- Search for the main program file
- |
- :0040C506 BE18CB4900 mov esi, 0049CB18
- :0040C50B 89E7 mov edi, esp
-
- * Possible StringData Ref from Data Obj ->"rb" <-- "rb" or Read Binary
- |
- :0040C50D BA24CB4900 mov edx, 0049CB24
- :0040C512 57 push edi
- :0040C513 2BC9 sub ecx, ecx
- :0040C515 49 dec ecx
- :0040C516 B000 mov al, 00
- :0040C518 F2 repnz
- :0040C519 AE scasb
- :0040C51A 4F dec edi
-
- * Referenced by a (U)nconditional or (C)onditional Jump at Address:
- |:0040C531(C)
- |
- :0040C51B 8A06 mov al, byte ptr [esi]
- :0040C51D 8807 mov byte ptr [edi], al
- :0040C51F 3C00 cmp al, 00
- :0040C521 7410 je 0040C533
- :0040C523 8A4601 mov al, byte ptr [esi+01]
- :0040C526 83C602 add esi, 00000002
- :0040C529 884701 mov byte ptr [edi+01], al
- :0040C52C 83C702 add edi, 00000002
- :0040C52F 3C00 cmp al, 00
- :0040C531 75E8 jne 0040C51B
-
- * Referenced by a (U)nconditional or (C)onditional Jump at Address:
- |:0040C521(C)
- |
- :0040C533 5F pop edi
- :0040C534 89E0 mov eax, esp
- :0040C536 B908000000 mov ecx, 00000008
- :0040C53B 8DBC2400010000 lea edi, dword ptr [esp+00000100]
- :0040C542 E849510800 call 00491690
- :0040C547 89C6 mov esi, eax
- :0040C549 89C5 mov ebp, eax
- :0040C54B 31C0 xor eax, eax
- :0040C54D 89E2 mov edx, esp
- :0040C54F 88C4 mov ah, al
- :0040C551 6689C3 mov bx, ax
- :0040C554 C1C010 rol eax, 10
- :0040C557 6689D8 mov ax, bx
- :0040C55A 89CB mov ebx, ecx
- :0040C55C C1F902 sar ecx, 02
- :0040C55F F3 repz
- :0040C560 AB stosd
- :0040C561 89D9 mov ecx, ebx
- :0040C563 83E103 and ecx, 00000003
- :0040C566 F3 repz
- :0040C567 AA stosb
- :0040C568 BB03000000 mov ebx, 00000003
- :0040C56D 8D842400010000 lea eax, dword ptr [esp+00000100]
- :0040C574 E88D570800 call 00491D06
- :0040C579 8D842400010000 lea eax, dword ptr [esp+00000100]
- :0040C580 50 push eax
-
- * Reference To: KERNEL32.GetDriveTypeA, Ord:0003h <-- Commonly used in CD checks and how
- | <-- we found this routine
- :0040C581 2EFF150C024F00 Call dword ptr cs:[004F020C]
- :0040C588 89C2 mov edx, eax <-- Drive type value in eax moved to edx
- :0040C58A 85F6 test esi, esi
- :0040C58C 7407 je 0040C595
- :0040C58E 89F0 mov eax, esi
- :0040C590 E8AE550800 call 00491B43
-
- * Referenced by a (U)nconditional or (C)onditional Jump at Address:
- |:0040C58C(C)
- |
- :0040C595 83FA05 cmp edx, 00000005 <-- Compare drive type to CD rom value
- :0040C598 7514 jne 0040C5AE <-- Take this jump for non-CD drive
- :0040C59A 85ED test ebp, ebp
- :0040C59C 7410 je 0040C5AE
- :0040C59E E81D000000 call 0040C5C0
- :0040C5A3 85C0 test eax, eax
- :0040C5A5 7407 je 0040C5AE
- :0040C5A7 B801000000 mov eax, 00000001 <-- Set up for passed CD check
- :0040C5AC EB02 jmp 0040C5B0 <-- Jump over "set for fail"
-
- * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: <-- All fails come to this
- |:0040C482(C), :0040C4BB(C), :0040C598(C), :0040C59C(C), :0040C5A5(C) <-- this point!
- |
- :0040C5AE 31C0 xor eax, eax <-- Set up for failed CD check
-
- * Referenced by a (U)nconditional or (C)onditional Jump at Address:
- |:0040C5AC(U)
- |
- :0040C5B0 81C418010000 add esp, 00000118 <-- Jump to or fall through to this
- :0040C5B6 5D pop ebp <-- exitting section of code
- :0040C5B7 5F pop edi
- :0040C5B8 5E pop esi
- :0040C5B9 5A pop edx
- :0040C5BA 59 pop ecx
- :0040C5BB 5B pop ebx
- :0040C5BC C3 ret
-
- That's the routine that checks for the pboat.exe on the CD which is of course the CD check! So
- now we are left with figuring out how to disable it and make it always return good. Or you can back
- trace the 4 callers and get the 4 strings to search for and change them to B8 01 00 00 00. I thought
- as long as the failed attemps all come down to 40C5AE, why not change the XOR EAX, EAX to JMP 40C5A7.
- That way when the CD check fails the code comes to 40C5AE and is redirected up to 40C5A7 which will
- load eax with 00000001, the value for a passed CD check. Then it jumps over our rediect jump to the
- exit section. This will work out just right as we can use the 8 bit jump which is a 2 byte instruction
- and the same length as the xor instruction. Making this edit to the exe file results in a playable
- Powerboat Racing that no longer requires you to have the CD online. So search for the following
- string: 74 07 B8 01 00 00 00 EB 02 31 C0 81 C4 and change the "31 C0" to "EB F7" The actual edit:
-
- Edit Pboat.exe at offset 47,534
- ===============================
- Search for: 31 C0 81 C4
- Change to : EB F7 -- --
-
- Once again a simple CD check (read "program bug") has been FiX'ed
-
- Static Vengeance
-
- PS> After digging around in the disassembled code I found this:
-
- Powerboat Racing CHEATS by Static Vengeance
-
- Enter as PASSWORD
-
- FAN Catamarans in Minnow Class
- DIP Catamarans in Pike Class
- URN Catamarans in Baracuda Class
- PBR Enable slalom racing
- PDL Enable secret MINES race course
- EPS Enable Championship race
-
- Enter as your name
-
- BIG Infamous Japanese BIG-HEAD mode
- POW Big engines
- SML Tiny boats (radio control size)
- WIN All other racers at half speed so you can WIN
- BAA Slow CPU boats
- BAD Fast boats
- BIF Fast boats
-
- TIP: Just as the anouncer says "one" take off. If you do it right
- you get a TURBO launch like in UBISoft's pod
-